From de418e6fdf9f902b864b7d15abb34815aa08200a Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Mon, 14 Feb 2005 11:42:11 +0000 Subject: [PATCH] bitkeeper revision 1.1201 (42108e93jNjU6R-4pZQGJCtUzl_HkQ) Fix SMP booting. Clean up x86/64 a bit. Signed-off-by: keir.fraser@cl.cam.ac.uk --- xen/arch/x86/domain.c | 20 ++++++++++---------- xen/arch/x86/smpboot.c | 2 +- xen/arch/x86/x86_64/entry.S | 28 +++++++++++++++++++--------- xen/drivers/char/console.c | 2 ++ xen/include/asm-x86/shadow.h | 27 ++++++--------------------- 5 files changed, 38 insertions(+), 41 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 7e9b9bd763..1b02b07921 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -541,6 +541,14 @@ void new_thread(struct exec_domain *d, #ifdef __x86_64__ +void toggle_guest_mode(struct exec_domain *ed) +{ + ed->arch.flags ^= TF_kernel_mode; + __asm__ __volatile__ ( "swapgs" ); + update_pagetables(ed); + write_ptbase(ed); +} + #define loadsegment(seg,value) ({ \ int __r = 1; \ __asm__ __volatile__ ( \ @@ -655,12 +663,7 @@ static void switch_segments( } if ( !(n->arch.flags & TF_kernel_mode) ) - { - n->arch.flags |= TF_kernel_mode; - __asm__ __volatile__ ( "swapgs" ); - update_pagetables(n); - write_ptbase(n); - } + toggle_guest_mode(n); regs->entry_vector = TRAP_syscall; regs->rflags &= 0xFFFCBEFFUL; @@ -681,10 +684,7 @@ long do_switch_to_user(void) unlikely(pagetable_val(ed->arch.guest_table_user) == 0) ) return -EFAULT; - ed->arch.flags &= ~TF_kernel_mode; - __asm__ __volatile__ ( "swapgs" ); - update_pagetables(ed); - write_ptbase(ed); + toggle_guest_mode(ed); regs->rip = stu.rip; regs->cs = stu.cs; diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c index 00838ecce2..46a780a6ba 100644 --- a/xen/arch/x86/smpboot.c +++ b/xen/arch/x86/smpboot.c @@ -668,7 +668,7 @@ static void __init do_boot_cpu (int apicid) set_bit(DF_IDLETASK, &idle->d_flags); - ed->arch.guest_table = mk_pagetable(__pa(idle_pg_table)); + ed->arch.monitor_table = mk_pagetable(__pa(idle_pg_table)); map_cpu_to_boot_apicid(cpu, apicid); diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S index feb7ec342b..c957c1b19b 100644 --- a/xen/arch/x86/x86_64/entry.S +++ b/xen/arch/x86/x86_64/entry.S @@ -19,6 +19,7 @@ movq (reg),reg; ALIGN +/* %rbx: struct exec_domain */ restore_all_guest: btr $_TF_failsafe_return,EDOMAIN_thread_flags(%rbx) jc failsafe_callback @@ -37,9 +38,11 @@ restore_all_guest: 1: sysretl ALIGN +/* No special register assumptions. */ iret_exit_to_guest: addq $8,%rsp FLT1: iretq + .section .fixup,"ax" FIX1: popq -15*8-8(%rsp) # error_code/entry_vector SAVE_ALL # 15*8 bytes pushed @@ -79,6 +82,7 @@ failsafe_callback: RESTORE_ALL addq $8,%rsp FLT2: iret + .section .fixup,"ax" FIX2: pushq %rbx GET_CURRENT(%rbx) @@ -91,6 +95,7 @@ FIX2: pushq %rbx .previous ALIGN +/* No special register assumptions. */ restore_all_xen: RESTORE_ALL addq $8,%rsp @@ -130,6 +135,7 @@ ENTRY(syscall_enter) pushq restore_all_guest(%rip) jmp create_bounce_frame +/* %rbx: struct exec_domain */ hypercall: sti movq %r10,%rcx @@ -138,6 +144,7 @@ hypercall: callq *(%r10,%rax,8) movq %rax,XREGS_rax(%rsp) # save the return value +/* %rbx: struct exec_domain */ test_all_events: cli # tests must not race interrupts /*test_softirqs:*/ @@ -163,6 +170,7 @@ test_all_events: jmp restore_all_guest ALIGN +/* %rbx: struct exec_domain */ process_softirqs: sti call SYMBOL_NAME(do_softirq) @@ -170,8 +178,8 @@ process_softirqs: /* CREATE A BASIC EXCEPTION FRAME ON GUEST OS STACK: */ /* { RCX, R11, [DS-GS,] [CR2,] [ERRCODE,] RIP, CS, RFLAGS, RSP, SS } */ -/* %rdx == trap_bounce, %rbx == task_struct */ -/* %rax,%rcx are clobbered. %rsi contains new XREGS_rsp. */ +/* %rdx: trap_bounce, %rbx: struct exec_domain */ +/* On return only %rbx is guaranteed non-clobbered. */ create_bounce_frame: /* Push new frame at existing %rsp if already in guest-OS mode. */ movq XREGS_rsp+8(%rsp),%rsi @@ -225,19 +233,16 @@ FLT14: movq %rax,(%rsi) # R11 FLT15: movq %rax,(%rsi) # RCX /* Rewrite our stack frame and return to guest-OS mode. */ /* IA32 Ref. Vol. 3: TF, VM, RF and NT flags are cleared on trap. */ - movb $0,TRAPBOUNCE_flags(%rdx) - bts $_TF_kernel_mode,EDOMAIN_thread_flags(%rbx) - jc 1f - swapgs - movq %rbx,%rdi - call SYMBOL_NAME(write_ptbase) -1: movl $TRAP_syscall,XREGS_entry_vector+8(%rsp) + movl $TRAP_syscall,XREGS_entry_vector+8(%rsp) andl $0xfffcbeff,XREGS_eflags+8(%rsp) movl $__GUEST_SS,XREGS_ss+8(%rsp) movq %rsi,XREGS_rsp+8(%rsp) movl $__GUEST_CS,XREGS_cs+8(%rsp) movq TRAPBOUNCE_eip(%rdx),%rax movq %rax,XREGS_rip+8(%rsp) + movb $0,TRAPBOUNCE_flags(%rdx) + testb $TF_kernel_mode,EDOMAIN_thread_flags(%rbx) + jz SYMBOL_NAME(toggle_guest_mode) ret .section .fixup,"ax" FIX3: sti @@ -264,6 +269,7 @@ DBLFLT2:jmp process_guest_exception_and_events .previous ALIGN +/* %rbx: struct exec_domain */ process_guest_exception_and_events: leaq EDOMAIN_trap_bounce(%rbx),%rdx testb $TBF_EXCEPTION,TRAPBOUNCE_flags(%rdx) @@ -273,6 +279,7 @@ process_guest_exception_and_events: jmp test_all_events ALIGN +/* No special register assumptions. */ ENTRY(ret_from_intr) GET_CURRENT(%rbx) testb $3,XREGS_cs(%rsp) @@ -280,6 +287,7 @@ ENTRY(ret_from_intr) jmp restore_all_xen ALIGN +/* No special register assumptions. */ error_code: SAVE_ALL testb $X86_EFLAGS_IF>>8,XREGS_eflags+1(%rsp) @@ -294,6 +302,7 @@ error_code: jz restore_all_xen jmp process_guest_exception_and_events +/* No special register assumptions. */ exception_with_ints_disabled: testb $3,XREGS_cs(%rsp) # interrupts disabled outside Xen? jnz 1b # it really does happen! @@ -315,6 +324,7 @@ exception_with_ints_disabled: movq %rax,XREGS_kernel_sizeof(%rsp) jmp restore_all_xen # return to fixup code +/* No special register assumptions. */ FATAL_exception_with_ints_disabled: movl XREGS_entry_vector(%rsp),%edi movq %rsp,%rsi diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index 00f2223f77..9ddfa2e90a 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -553,6 +553,8 @@ static int __init debugtrace_init(void) debugtrace_buf = (unsigned char *)alloc_xenheap_pages(order); ASSERT(debugtrace_buf != NULL); + memset(debugtrace_buf, '\0', debugtrace_bytes); + return 0; } __initcall(debugtrace_init); diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h index 190ffe1669..3f6f273de3 100644 --- a/xen/include/asm-x86/shadow.h +++ b/xen/include/asm-x86/shadow.h @@ -739,11 +739,8 @@ static inline void __update_pagetables(struct exec_domain *ed) if ( unlikely(smfn == 0) ) smfn = shadow_l2_table(d, gpfn); #ifdef CONFIG_VMX - else - if (shadow_mode_translate(ed->domain) ) - { - vmx_update_shadow_state(ed, gpfn, smfn); - } + else if ( shadow_mode_translate(ed->domain) ) + vmx_update_shadow_state(ed, gpfn, smfn); #endif ed->arch.shadow_table = mk_pagetable(smfn<domain)) ) { - SH_VVLOG("update_pagetables( gptbase=%p, mode=%d )", - pagetable_val(ed->arch.guest_table), - shadow_mode(ed->domain)); - shadow_lock(ed->domain); __update_pagetables(ed); shadow_unlock(ed->domain); - - SH_VVLOG("leaving update_pagetables:\n" - "( gptbase=%p, mode=%d ) sh=%p", - pagetable_val(ed->arch.guest_table), - shadow_mode(ed->domain), - pagetable_val(ed->arch.shadow_table) ); } - else #ifdef __x86_64__ - if ( !(ed->arch.flags & TF_kernel_mode) ) - ed->arch.monitor_table = ed->arch.guest_table_user; - else + else if ( !(ed->arch.flags & TF_kernel_mode) ) + ed->arch.monitor_table = ed->arch.guest_table_user; #endif - ed->arch.monitor_table = ed->arch.guest_table; - + else + ed->arch.monitor_table = ed->arch.guest_table; } #if SHADOW_DEBUG -- 2.30.2